package com.bjpowernode.common.client;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * Redis操作的封装类
 */

@Component
public class RedisClient {

    //StringRedisTemplate继承RedisTemplate<String, String>
    private StringRedisTemplate template;

    /**
     * 通过构造方法对stringRedisTemplate初始化
     *
     * @param stringRedisTemplate
     */
    public RedisClient(StringRedisTemplate stringRedisTemplate) {
        this.template = stringRedisTemplate;
    }

    //判断key是否存在
    public Boolean exists(String key) {
        return template.hasKey(key);
    }

    //删除key
    public Boolean deleteKey(String key) {
        return template.delete(key);
    }

    //将短信验证码存入Redis中，有效时间为3分钟
    public Boolean setVal(String key, String value, long timeout, TimeUnit unit) {
        template.opsForValue().set(key, value, timeout, unit);
        //根据redis中是否有存储的key来判断是否存储成功
        return template.hasKey(key);
    }


    //zset类型的数据添加    在set(key,value)的基础上添加了一个score值,
    //score代表的是每个成员的分数，这个分数可以用来排序
    public Boolean addZSet(String key, String value, double score) {
        return template.opsForZSet().add(key, value, score);
    }

    //更新zset中某个value的socre
    //incrementScore：将指定成员的分数增加指定数值
    public void updateScore(String key, String value, double score) {
        this.template.opsForZSet().incrementScore(key, value, score);
    }

    //删除redis中的某个value
    public void deleteValue(String key, String value) {
        this.template.opsForZSet().remove(key, value);
    }


    //按score倒序获取前三名的数据[start,end]
    //TapedTuple包含了zset中的具体数据   reverse  反序
    public Set<ZSetOperations.TypedTuple<String>> reserveScore(String key, long start, long end) {
        return template.opsForZSet().reverseRangeWithScores(key, start, end);
    }

    //获取zset的所有value和score(正序)
    //TapedTuple包含了zset中的具体数据，越先充值的越先查询   正序
    public Set<ZSetOperations.TypedTuple<String>> getRange(String key, long start, long end) {
        return template.opsForZSet().rangeWithScores(key, start, end);
    }

    //读取key的值
    public String getVal(String key) {
        return template.opsForValue().get(key);
    }

    //生成唯一序号(redis incr命令  将key中储存的数字增一)
    public Long incr(String key) {
        return template.opsForValue().increment(key);
    }

    //Hash类型的数据添加
    //业务需求：一个存储空间保存多个键值对数据
    // key field value
    public Boolean addHash(String key, Map<String, String> data, long timeout, TimeUnit timeUnit) {
        //putAll(key,data)方法将一个Map的所有条目存入Redis哈希中
        template.opsForHash().putAll(key, data);
        //设置过期时间，返回值是一个Bollean值，表示是否成功设置了过期时间
        return template.expire(key, timeout, timeUnit);
    }

    //获取hash某个field的值
    public String getHashField(String key, String field) {
        Object object = template.opsForHash().get(key, field);
        return String.valueOf(object);
    }

    //更新某一个Field的值
    public void updateField(String key, String field, String value) {
        this.template.opsForHash().put(key, field, value);
    }

    //获取hash所有field的值
    public Map<Object, Object> getAllHashField(String key) {
        Map<Object, Object> object = template.opsForHash().entries(key);
        return object;
    }
}
